﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AvisoSuporte
{
    public partial class Principal : Form
    {
        //DadosBugs dataSet = new DadosBugs();
        List<Model.WorkItem> colecaoWIAntiga = new List<Model.WorkItem>();
        DateTime dataInicial_aux = DateTime.Now;
        delegate void EnviaMensagemtextBoxAlertasCallBack(string p);
        delegate void EnviaMensagemTextBoxNovosBugsCallBack(string p);
        delegate void PopulaGridCallBack(List<Model.WorkItem> colecaoWI);
        delegate void EnviaMensagemGroupBoxCallBack();

        public class Farol
        {
            public string Nome { get; set; }
            public int Quantidade { get; set; }
            public string Imagem 
            {
                get 
                {
                    if (Quantidade == 0)
                        return "farol_verde.gif";
                    else if (Quantidade == 1)
                        return "farol_amarelo.gif";
                    else if (Quantidade >= 2)
                        return "farol_vermelho.gif";

                    return "";
                }
            }
        }
        List<Farol> lista = new List<Farol>();

        public string Usuario
        {
            get;
            set;
        }

        public string Senha
        {
            get;
            set;
        }


        public Principal()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //chama tela de login

            //Login login = new Login();
            //login.ShowDialog(this);


            //primeira chamada ao tfs
            System.Threading.Thread piThread = new System.Threading.Thread(new System.Threading.ThreadStart(ResgatarBugs));
            piThread.Start();

            dtgBugs.AutoGenerateColumns = false;
//            dtgTasks.AutoGenerateColumns = false;

            //colocar aguarde na tela
            ticker_TFS.Enabled = true;
            ticker_TFS.Interval = 600000;
            ticker_TFS.Tick += new EventHandler(ticker_TFS_Tick);
            ticker_TFS.Start();

            //notifyIcon.Visible = false;
            notify_new_bug.Visible = false;
            notify_bug_ok.Visible = false;

            //pega o log do dia e joga nos textbox
            ResgataLog();

            
        }

        private void ResgataLog()
        {

            string texto_novosbugs = string.Empty;
            string texto_alertas = string.Empty;

            if(System.IO.File.Exists(DateTime.Now.ToString("yyyyMMdd") + "_log_novosbugs.txt"))
                texto_novosbugs = System.IO.File.ReadAllText(DateTime.Now.ToString("yyyyMMdd") + "_log_novosbugs.txt");

            if(System.IO.File.Exists(DateTime.Now.ToString("yyyyMMdd") + "_log_alertas.txt"))
                texto_alertas = System.IO.File.ReadAllText(DateTime.Now.ToString("yyyyMMdd") + "_log_alertas.txt");

            txtAlertas.Text = texto_alertas;
            txtNovosBugs.Text = texto_novosbugs;
        }

        public void ticker_TFS_Tick(object sender, EventArgs e)
        {

            System.Threading.Thread piThread = new System.Threading.Thread(new System.Threading.ThreadStart(ResgatarBugs));
            piThread.Start();
            
        }

        public void ResgatarBugs()
        {

            DateTime aux = DateTime.Now;

            lblStatusBar.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + " - Iniciando Pesquisa no TFS, Aguarde...";
            Communication.Geral geral = new AvisoSuporte.Communication.Geral();
            geral.Usuario = this.Usuario;
            geral.Senha = this.Senha;
            List<Model.WorkItem> colecaoWI = geral.RetornaBugs();
            PopulaGrid(colecaoWI);


            //List<Model.WorkItem> colecaoPendencias = geral.RetornaTasksSiteBmfBovespa();
            //PopulaGridTasks(colecaoPendencias);

            //passa por cada bug, se for novo, coloca na lista de bugs novos

            lista.Clear();
            
            lista.Add(new Farol() { Nome = "Carlos Alberto Gonçalves Carvalho", Quantidade = 0 });
            lista.Add(new Farol() { Nome = "Joao Paulo Gregório Pontes", Quantidade = 0 });
            lista.Add(new Farol() { Nome = "Marcelo Luis Prudente do Amaral", Quantidade = 0 });

            foreach(Model.WorkItem item in colecaoWI)
            {
                bool novo_bug = false;
                bool find = false;
                //verifica se existe o bug na lista atual

                if(colecaoWIAntiga != null && colecaoWIAntiga.Count != 0)
                {
                    foreach(Model.WorkItem item_antigo in colecaoWIAntiga)
                    {
                        if(item_antigo.ID == item.ID)
                        {
                            find = true;
                            //verifica se o status do workitem é diferente
                            if(item.State != item_antigo.State)
                                EnviaMensagemtextBoxAlertas(DateTime.Now.ToString("HH:mm:ss") + " - O bug " + item.ID + " foi alterado - De " + item_antigo.State + " para " + item.State);

                            continue;
                        }
                    }


                    if(!find)
                    {
                        EnviaMensagemTrayIcon("NOVO BUG: " + item.ID, "O bug " + item.ID + " foi enviado para a equipe de Suporte",2);
                        EnviaMensagemTextBoxNovosBugs(DateTime.Now.ToString("HH:mm:ss") + " - Novo bug aberto para a equipe de Suporte: " + item.ID);
                        novo_bug = true;
                    }
                }

                //verifica se o bug deve ser entregue em menos de duas horas
                if(item.FinishDate == null || item.FinishDate == DateTime.MinValue)
                {
                    EnviaMensagemtextBoxAlertas(DateTime.Now.ToString("HH:mm:ss") + " - O bug " + item.ID + " está sem data de início!");
                    //EnviaMensagemTrayIcon("NOVO BUG: " + item.ID, "O bug " + item.ID + " foi enviado para a equipe de Suporte");
                    
                    if(!novo_bug)
                        EnviaMensagemTextBoxNovosBugs(DateTime.Now.ToString("HH:mm:ss") + " - Novo bug aberto para a equipe de Suporte: " + item.ID);
                    
                    novo_bug = false;

                }
                else if(DateTime.Now >= item.FinishDate)
                {
                    EnviaMensagemtextBoxAlertas(DateTime.Now.ToString("HH:mm:ss") + " - O bug " + item.ID + " está atrasado e deve ser replanejado");
                }
                else if(DateTime.Now.AddHours(2) >= item.FinishDate)
                {
                    EnviaMensagemtextBoxAlertas(DateTime.Now.ToString("HH:mm:ss") + " - O bug " + item.ID + " deve ser entregue em até 2 horas");
                }

                find = false;


                bool find_farol = false;
                foreach (Farol farol in lista) 
                {
                    if (farol.Nome == item.AssignedTo)
                    {
                        farol.Quantidade++;
                        break;
                    }
                }

            }

            foreach (Farol farol in lista)
            {
                if (farol.Nome == "Carlos Alberto Gonçalves Carvalho")
                    pbGoncalves.Image = Image.FromFile(farol.Imagem);

                if (farol.Nome == "Joao Paulo Gregório Pontes")
                    pbJP.Image = Image.FromFile(farol.Imagem);

                if (farol.Nome == "Marcelo Luis Prudente do Amaral")
                    pbAmaral.Image = Image.FromFile(farol.Imagem);
            }

            //faz o inverso, para verificar se algum bug foi corrigido ou cancelado
            foreach(Model.WorkItem item_novo in colecaoWIAntiga)
            {
                bool find_novo = false;
                //verifica se existe o bug na lista atual
                foreach(Model.WorkItem item_antigo in colecaoWI)
                {
                    if(item_antigo.ID == item_novo.ID)
                    {
                        find_novo = true;
                        continue;
                    }
                }


                if(!find_novo)
                {
                    EnviaMensagemtextBoxAlertas(DateTime.Now.ToString("HH:mm:ss") + " - O bug " + item_novo.ID + " foi corrigido ou devolvido");
                    EnviaMensagemTrayIcon("BUG CORRIGIDO: " + item_novo.ID, "O bug " + item_novo.ID + " foi corrigido",3);
                }

                find_novo = false;


            }
            
            



            colecaoWIAntiga = colecaoWI;

            lblStatusBar.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + " - Pesquisa Finalizada no TFS - Próxima atualização - " + aux.AddMinutes(10).ToString("dd/MM/yyyy HH:mm:ss");

            EnviaMensagemGroupBox();


        }

        private void PopulaGridTasks(List<Model.WorkItem> colecaoPendencias)
        {
            //if (dtgTasks.InvokeRequired)
            //{
            //    PopulaGridCallBack callBack = new PopulaGridCallBack(PopulaGridTasks);
            //    this.Invoke(callBack, new object[] { colecaoPendencias });
            //}
            //else
            //{
            //    dtgTasks.DataSource = colecaoPendencias;
            //}
        }

        private void EnviaMensagemGroupBox()
        {
            if (groupBox5.InvokeRequired || groupBox5.InvokeRequired)
            {
                EnviaMensagemGroupBoxCallBack callBack = new EnviaMensagemGroupBoxCallBack(EnviaMensagemGroupBox);
                this.Invoke(callBack);
            }
            else
            {
                groupBox1.Text = "Novos Bugs - " + DateTime.Now.ToString("dd/MM/yyyy");
                groupBox5.Text = "Alertas - " + DateTime.Now.ToString("dd/MM/yyyy");
            }

        }

        private void EnviaMensagemtextBoxAlertas(string p)
        {
            if(txtAlertas.InvokeRequired)
            {
                EnviaMensagemtextBoxAlertasCallBack callBack = new EnviaMensagemtextBoxAlertasCallBack(EnviaMensagemtextBoxAlertas);
                this.Invoke(callBack, new object[] { p });
            }
            else
            {
                txtAlertas.Text = p + Environment.NewLine + txtAlertas.Text;
            }
            
        }

        private void EnviaMensagemTextBoxNovosBugs(string p)
        {
            if(txtNovosBugs.InvokeRequired)
            {
                EnviaMensagemTextBoxNovosBugsCallBack callBack = new EnviaMensagemTextBoxNovosBugsCallBack(EnviaMensagemTextBoxNovosBugs);
                this.Invoke(callBack, new object[] { p });
            }
            else
            {
                txtNovosBugs.Text = p + Environment.NewLine + txtNovosBugs.Text;
            }
        }

        /// <summary>
        /// tipo 1 = normal, tipo 2 = bug_novo, tipo 3 = bug_ok
        /// </summary>
        /// <param name="titulo"></param>
        /// <param name="descricao"></param>
        /// <param name="tipo"></param>
        private void EnviaMensagemTrayIcon(string titulo, string descricao, int tipo)
        {
            if(tipo == 1)
            {
                notifyIcon.ShowBalloonTip(3600000, titulo, descricao, ToolTipIcon.Info);
            }
            else if(tipo == 2)
            {
                if(!notify_new_bug.Visible)
                    notify_new_bug.Visible = true;

                notify_new_bug.ShowBalloonTip(3600000, titulo, descricao, ToolTipIcon.Info);
            }
            else if(tipo == 3)
            {
                if(!notify_bug_ok.Visible)
                    notify_bug_ok.Visible = true;

                notify_bug_ok.ShowBalloonTip(3600000, titulo, descricao, ToolTipIcon.Info);
            }
        }

        private void PopulaGrid(List<Model.WorkItem> colecaoWI)
        {
            if(dtgBugs.InvokeRequired)
            {
                PopulaGridCallBack callBack = new PopulaGridCallBack(PopulaGrid);
                this.Invoke(callBack, new object[] { colecaoWI });
            }
            else
            {
                dtgBugs.DataSource = colecaoWI;
            }
        }

        private int ConverteParaHoras(string valor)
        {
            if(valor.Trim() == "Imediato")
                return 8;
            else if(valor.Trim() == "Urgente")
                return 12;
            else if(valor.Trim() == "Alta")
                return 16;
            else if(valor.Trim() == "Normal")
                return 24;
            else if(valor.Trim() == "Baixa")
                return 36;

            return 0;
        }

        

        private int ItemSelecionado(int numeroHoras_aux)
        {
            int retorno = 0;
            switch(numeroHoras_aux)
            {
                case 8:
                    retorno = 0;
                    break;
                case 12:
                    retorno = 1;
                    break;
                case 16:
                    retorno = 2;
                    break;
                case 24:
                    retorno = 3;
                    break;
                case 36:
                    retorno = 4;
                    break;
                default:
                    break;
            }
            return retorno;
        }

        private int ConverteCombo(string valor)
        {

            if(valor.Trim() == "Imediato : 8")
                return 8;
            else if(valor.Trim() == "Urgente: 12")
                return 12;
            else if(valor.Trim() == "Alta: 16")
                return 16;
            else if(valor.Trim() == "Normal: 24")
                return 24;
            else if(valor.Trim() == "Baixa: 36")
                return 36;

            return 0;
            
        }

        private DateTime CalculaDataHora(DateTime dataInicial, int horas)
        {
            DateTime dataFinal = AdicionaHorasUteis(dataInicial,horas);
            return dataFinal;
        }

        private DateTime AdicionaHorasUteis(DateTime dataInicial, int horas)
        {
            DateTime aux = dataInicial;
            DateTime retorno = dataInicial;

            DateTime min = new DateTime(dataInicial.Year, dataInicial.Month, dataInicial.Day, 7, 30, 0);
            DateTime max = new DateTime(dataInicial.Year, dataInicial.Month, dataInicial.Day, 20, 0, 0);

            for(int i = 0; i < horas*2; i++)
            {
                aux = aux.AddHours(0.5);


                if(!(aux < min || aux > max) && aux.DayOfWeek != DayOfWeek.Saturday && aux.DayOfWeek != DayOfWeek.Sunday)
                {
                    retorno = aux;
                }
                else
                {
                    while((aux <= min || aux >= max) || aux.DayOfWeek == DayOfWeek.Saturday || aux.DayOfWeek == DayOfWeek.Sunday)
                    {
                        aux = aux.AddHours(0.5);

                        if(aux.Day != max.Day)
                        {
                            max = max.AddDays(1);
                            min = min.AddDays(1);
                        }
                    }
                    retorno = aux;
                }

                if(aux.Day != max.Day)
                {
                    max = max.AddDays(1);
                    min = min.AddDays(1);
                }
            }
            return retorno.AddMinutes(30);

        }


        private void notifyIcon_DoubleClick(object sender, EventArgs e)
        {

            Show();
            WindowState = FormWindowState.Normal;

        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if(FormWindowState.Minimized == WindowState)
            {
                Hide();
            }

        }


        private void dtgBugs_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if(sender.GetType() == typeof(DataGridView))
            {
                if(e.ColumnIndex == 1)
                {
                    dtgBugs.Rows[e.RowIndex].Cells[2].Value = AdicionaHorasUteis(Convert.ToDateTime(dtgBugs.Rows[e.RowIndex].Cells[e.ColumnIndex].Value), Convert.ToInt32(ConverteParaHoras(dtgBugs.Rows[e.RowIndex].Cells[3].Value.ToString()))).ToString();
                    dtgBugs.Rows[e.RowIndex].Cells[2].Style.BackColor = Color.LightGray;

                }
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            string file_novos = txtNovosBugs.Text.Replace("\n", "\r") + Environment.NewLine;
            string file_alerta = txtAlertas.Text.Replace("\n", "\r") + Environment.NewLine;

            
            if(txtNovosBugs.Text != string.Empty)
                System.IO.File.WriteAllText(DateTime.Now.ToString("yyyyMMdd") + "_log_novosbugs.txt", file_novos);
            
            if(txtAlertas.Text != string.Empty)
                System.IO.File.WriteAllText(DateTime.Now.ToString("yyyyMMdd") + "_log_alertas.txt", file_alerta);

            this.notify_bug_ok.Visible = false;
            this.notify_new_bug.Visible = false;
            this.notifyIcon.Visible = false;

        }

        private void btnAtualizar_Click(object sender, EventArgs e)
        {
            ticker_TFS_Tick(this, new EventArgs());
        }

        private void notify_new_bug_BalloonTipClicked(object sender, EventArgs e)
        {
            this.Show();
            this.notify_new_bug.Visible = false;
        }

        private void notify_new_bug_BalloonTipClosed(object sender, EventArgs e)
        {
            this.notify_new_bug.Visible = false;

        }

        private void notify_bug_ok_BalloonTipClicked(object sender, EventArgs e)
        {
            this.Show();
            this.notify_bug_ok.Visible = false;
        }

        private void notify_bug_ok_BalloonTipClosed(object sender, EventArgs e)
        {
            this.notify_bug_ok.Visible = false;
        }

        private void dtgBugs_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            PreencheDatas datas = new PreencheDatas(((Model.WorkItem)dtgBugs.Rows[e.RowIndex].DataBoundItem), false);
            datas.ShowDialog(this);
        }

        private void dtgBugs_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            foreach(DataGridViewRow row in dtgBugs.Rows)
            {
                if(((Model.WorkItem)(row.DataBoundItem)).FinishDate.Date == null || ((Model.WorkItem)(row.DataBoundItem)).FinishDate.Date == DateTime.MinValue)
                {
                    foreach(DataGridViewCell cell in row.Cells)
                    {
                        cell.Style.BackColor = Color.FromArgb(172,172,172);
                    }
                }
                else if(((Model.WorkItem)(row.DataBoundItem)).FinishDate.Date < DateTime.Now.Date)
                {
                    foreach(DataGridViewCell cell in row.Cells)
                    {
                        cell.Style.BackColor = Color.FromArgb(236,117,114);
                    }
                }
                else if(((Model.WorkItem)(row.DataBoundItem)).FinishDate.Date == DateTime.Now.Date)
                {
                    foreach(DataGridViewCell cell in row.Cells)
                    {
                        cell.Style.BackColor = Color.FromArgb(237,239,103);
                    }
                }
                else
                {
                    foreach(DataGridViewCell cell in row.Cells)
                    {
                        cell.Style.BackColor = Color.FromArgb(178,235,144);
                    }
                }

            }
        }

        private void dtgBugs_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void dtgTasks_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            //PreencheDatas datas = new PreencheDatas(((Model.WorkItem)dtgTasks.Rows[e.RowIndex].DataBoundItem), true);
            //datas.ShowDialog(this);
        }

        private void MenuItemDiario_Click(object sender, EventArgs e)
        {
            ProcessarRelatorioDiario relatorio = new ProcessarRelatorioDiario();
            relatorio.ShowDialog(this);
        }

        private void MenuItemMensal_Click(object sender, EventArgs e)
        {
            ProcessarRelatorioMensal relatorio = new ProcessarRelatorioMensal();
            relatorio.ShowDialog(this);
        }

        private void remedyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ProcessarRelatorioRemedy relatorio = new ProcessarRelatorioRemedy();
            relatorio.ShowDialog(this);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Alertas alertas = new Alertas(txtAlertas.Text, txtNovosBugs.Text);
            alertas.ShowDialog(this);
        }
    }
}
